﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GS1.Utilitario;
using log4net;
using System.Data;
using System.IO;
using System.Configuration;
using SegIdenPC.Entidad;
using SegIdenPC.Herramientas;

namespace SegIdenPC.Helper
{
    /// <summary>
    /// Clase       : TransferenciaHelper
    /// Descripcion : Permite realizar la sincronizacion entre pc y movil
    /// Autor       : Pedro Miguel Vera Rafael
    /// Fecha       : 28/03/2014
    /// Empresa     : GS1 Peru
    /// <summary>
    public class TransferenciaHelper : IDisposable
    {
        #region --- Variables y Constantes ---
        private static readonly ILog log = LogManager.GetLogger(typeof(TransferenciaHelper));

        private ComunicacionHelper comunicacion = null;

        private const string COMANDO_SINCRONIZACION_FECHAHORA = "/Fecha {0}";
        private const string FORMATO_FECHAHORA = "yyyy-MM-dd HH:mm:ss";

        private const string FORMATO_FECHA_ARCHIVO = "yyyyMMdd";
        private const string FORMATO_HORA_ARCHIVO = "HHmmss";

        private const string PUNTO = ".";
        private const string FORMATO_NOMBRE_ARCHIVO_GENERADO = "{0}_{1}{2}{3}{4}";

        private const string EXTENSION_DESCARGA = ".sdf";
        private const string EXTENSION_CARGA = ".db";

        private const string TEXTO = "*.TXT";
        private const string DBF = "*.DBF";
        private const string XLS = "*.XLS";
        private const string SQLSERVER = "SQLSERVER";
        private const string ORACLE = "ORACLE";

        private const string NOMBRE_CONFIG_TRANSFERENCIA = "TransferenciaPC.xml";
        private const string FORMATO_RUTA_CONFIG_TRANSFERENCIA = "{0}{1}";

        public enum ProcesoSincronizacion
        {
            CARGA = 0,
            DESCARGA = 1,
            LIMPIAR = 2
        }

        #endregion

        #region --- Delegado y Evento ---
        public delegate void MensajesSincronizarHandler(string mensaje);
        public event MensajesSincronizarHandler mensajeSincronizar;

        private void OnMensajeSincronizar(string mensaje)
        {
            if (mensajeSincronizar != null)
            {
                mensajeSincronizar(mensaje);
            }
        }

        public delegate void AvanceSincronizarHandler(string mensaje, int porcentaje);
        public event AvanceSincronizarHandler avanceSincronizar;

        private void OnAvanceSincronizar(string mensaje, int porcentaje)
        {
            if (avanceSincronizar != null)
            {
                avanceSincronizar(mensaje, porcentaje);
            }
        }

        public delegate void ProcesoSincronizarHandler(ProcesoSincronizacion proceso);
        public event ProcesoSincronizarHandler procesoSincronizar;

        private void OnProcesoSincronizar(ProcesoSincronizacion proceso)
        {
            if (procesoSincronizar != null)
            {
                procesoSincronizar(proceso);
            }
        }
        #endregion

        #region --- Constructor y Destructor ---
        public TransferenciaHelper()
        {
            this.comunicacion = new ComunicacionHelper();
            Constantes.DETALLE_TRANSFERENCIA = new DataSet();
            Constantes.DETALLE_TRANSFERENCIA.ReadXml(string.Format(FORMATO_RUTA_CONFIG_TRANSFERENCIA, Libreria.AddSlash(Libreria.RutaApp),
                                                                                                      NOMBRE_CONFIG_TRANSFERENCIA));
        }

        public void Dispose()
        {
            if (this.comunicacion != null)
            {
                this.comunicacion.Dispose();
            }

            this.comunicacion = null;
        }
        #endregion

        #region --- Metodos de Transferencia ---
        public bool limpiarMovil()
        {
            bool resultado = false;
            string rutaBDMovil = string.Empty;

            try
            {
                #region --- Validar de conexion ---
                // Comprueba si hay conexion con un equipo a la pc
                if (!this.comunicacion.conectarMovil())
                {
                    Libreria.ShowMessageboxExclamacion("Equipo Movil desconectado a la PC!", "PDA no Encontrado");
                    return false;
                }
                #endregion

                #region --- Validar BD Movil ---
                // Validar existencia de base de datos
                if (!comunicacion.existeArchivoMovil(Libreria.AddSlash(ConfigurationManager.AppSettings[Constantes.DIRECTORIO_MOVIL_BD_MOVIL]) + ConfigurationManager.AppSettings[Constantes.ARCHIVO_MOVIL_NOMBRE_BD]))
                {
                    Libreria.ShowMessageboxInfo("El equipo movil se encuentra sin informacion", "Aviso...");
                    return true;
                }
                #endregion

                #region --- Copiar BD Movil a PC ---
                OnMensajeSincronizar("Copiando base de datos a PC...");
                rutaBDMovil = Libreria.AddSlash(ConfigurationManager.AppSettings[Constantes.DIRECTORIO_PC_DESCARGA_BKP]) +
                                  generarNombre(ConfigurationManager.AppSettings[Constantes.ARCHIVO_MOVIL_NOMBRE_BD], EXTENSION_DESCARGA);

                this.comunicacion.copiarArchivoPC(rutaBDMovil,
                                                  Libreria.AddSlash(ConfigurationManager.AppSettings[Constantes.DIRECTORIO_MOVIL_BD_MOVIL]) + ConfigurationManager.AppSettings[Constantes.ARCHIVO_MOVIL_NOMBRE_BD],
                                                  true);

                log.Debug("Base de datos copiada:" + rutaBDMovil);
                #endregion

                #region --- Eliminar BD Movil ---
                this.comunicacion.eliminarArchivoMovil(Libreria.AddSlash(ConfigurationManager.AppSettings[Constantes.DIRECTORIO_MOVIL_BD_MOVIL]) +
                                                       ConfigurationManager.AppSettings[Constantes.ARCHIVO_MOVIL_NOMBRE_BD]);
                #endregion

                #region --- Deshabilitado ---
                //#region --- Limpiar BD PC ---
                //using (SqLiteData bdRepositorio = new SqLiteData(rutaBDMovil))
                //{
                //    OnMensajeSincronizar("Limpiando Movimientos datos de base de datos...");
                //    bdRepositorio.limpiarTablas();
                //}
                //#endregion

                //#region --- Copiar BD PC Limpio al Movil ---
                //this.comunicacion.copiarArchivoMovil(rutaBDMovil,
                //                                     Libreria.AddSlash(ConfigurationManager.AppSettings[Constantes.DIRECTORIO_MOVIL_BD_MOVIL]) + ConfigurationManager.AppSettings[Constantes.ARCHIVO_MOVIL_NOMBRE_BD],
                //                                     true);


                //#endregion
                #endregion

                log.Debug("Registros Limpiados OK");
                Libreria.ShowMessageboxInfo("Registros eliminados, Satisfactoriamente!", "Aviso");

                resultado = true;
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex);
            }

            return resultado;
        }

        public bool sincronizar()
        {
            string rutaBDMovil = string.Empty;
            bool esCarga = false;

            CargaTransferir cargaTransferir = null;
            DescargaTransferir descargaTransferir = null;

            try
            {
                log.Debug("---- Inicio de Sincronizacion ---- ");

                #region --- Validar de conexion ---
                if (!this.comunicacion.conectarMovil())
                {
                    Libreria.ShowMessageboxExclamacion("El equipo Movil está desconectado de la PC!", "PDA no Encontrado");
                    return false;
                }

                OnAvanceSincronizar("Se encontró equipo...", 10);
                #endregion

                #region --- Sincronizar FechaHora ---
                if (!this.comunicacion.existeArchivoMovil(ConfigurationManager.AppSettings[Constantes.DIRECTORIO_MOVIL_ARCHIVO_APLICACION]))
                {
                    Libreria.ShowMessageboxExclamacion("Primero debe instalar la aplicación para poder sincronizar", "Aplicación no Encontrada");
                    return false;
                }

                // Sincronizando Fecha y hora
                this.comunicacion.ejecutarProcesoMovil(ConfigurationManager.AppSettings[Constantes.DIRECTORIO_MOVIL_ARCHIVO_APLICACION],
                                                       string.Format(COMANDO_SINCRONIZACION_FECHAHORA, DateTime.Now.ToString(FORMATO_FECHAHORA))
                                                       );

                OnAvanceSincronizar("Estableciendo Fecha y Hora...", 20);
                #endregion

                #region --- Validar BD Movil ---
                esCarga = !this.comunicacion.existeArchivoMovil(Libreria.AddSlash(ConfigurationManager.AppSettings[Constantes.DIRECTORIO_MOVIL_BD_MOVIL]) +
                                                                ConfigurationManager.AppSettings[Constantes.ARCHIVO_MOVIL_NOMBRE_BD]);
                #endregion

                #region --- Crear Carpeta Carga, Descarga y Backup - PC ---
                crearCarpetaPC(ConfigurationManager.AppSettings[Constantes.DIRECTORIO_PC_CARGA]); //Crea ruta de carga
                crearCarpetaPC(ConfigurationManager.AppSettings[Constantes.DIRECTORIO_PC_DESCARGA]); //Crea ruta de descaga de archivos
                crearCarpetaPC(ConfigurationManager.AppSettings[Constantes.DIRECTORIO_PC_DESCARGA_BKP]); //Crea ruta de descarga Backup
                #endregion

                #region --- Crear Carpeta BD - Movil ---
                this.comunicacion.crearCarpetaMovil(ConfigurationManager.AppSettings[Constantes.DIRECTORIO_MOVIL_BD_MOVIL]); // Crea la carpeta de la base de datos
                #endregion

                OnProcesoSincronizar(esCarga ? ProcesoSincronizacion.CARGA : ProcesoSincronizacion.DESCARGA);

                OnAvanceSincronizar("Tipo de Sincronizacion: " + (esCarga ? "CARGA" : "DESCARGA"), 30);
                log.Debug("Tipo de Sincronizacion: " + (esCarga ? "CARGA" : "DESCARGA"));

                if (esCarga)
                {
                    #region --- Sincronizar Carga ---
                    rutaBDMovil = Libreria.AddSlash(Libreria.RutaApp) + ConfigurationManager.AppSettings[Constantes.ARCHIVO_MOVIL_NOMBRE_BD];
                    if (File.Exists(rutaBDMovil)) { File.Delete(rutaBDMovil); }

                    // Instanciar Base de datos SQLITE
                    using (SqLiteDataHelper bdRepositorio = new SqLiteDataHelper(rutaBDMovil))
                    {
                        bdRepositorio.crearBaseDatos();
                        log.Debug("Base de Datos Movil, creada empieza la carga de datos(" + EXTENSION_CARGA + ")");
                        OnAvanceSincronizar("BD Movil creada, empieza la carga...", 40);

                        cargaTransferir = procesarCargar();
                        log.Debug("Se Obtuvo Info de BD Maestra");
                        OnAvanceSincronizar("Se obtuvo Info de BD Maestra...", 50);

                        bdRepositorio.importarData(cargaTransferir);
                        log.Debug("Se termino la carga de datos(" + EXTENSION_CARGA + ")");
                        OnAvanceSincronizar("Se termino la carga de datos movil...", 60);
                    }

                    //Copiar la base de datos al terminal
                    OnAvanceSincronizar("Copiando base de datos a Terminal...", 80);
                    this.comunicacion.copiarArchivoMovil(rutaBDMovil,
                                                         Libreria.AddSlash(ConfigurationManager.AppSettings[Constantes.DIRECTORIO_MOVIL_BD_MOVIL]) + ConfigurationManager.AppSettings[Constantes.ARCHIVO_MOVIL_NOMBRE_BD],
                                                         true);
                    //---------------------------------------------------------------------------------------------------------------------------------------------------------
                    log.Debug("Data cargada y copiada al Terminal Satisfactoriamente");
                    OnAvanceSincronizar("Información cargada correctamente...", 100);
                    #endregion
                }
                else
                {
                    #region --- Sincronizar Descarga ---
                    rutaBDMovil = Libreria.AddSlash(ConfigurationManager.AppSettings[Constantes.DIRECTORIO_PC_DESCARGA_BKP]) +
                                      generarNombre(ConfigurationManager.AppSettings[Constantes.ARCHIVO_MOVIL_NOMBRE_BD], EXTENSION_DESCARGA);

                    this.comunicacion.copiarArchivoPC(rutaBDMovil,
                                                      Libreria.AddSlash(ConfigurationManager.AppSettings[Constantes.DIRECTORIO_MOVIL_BD_MOVIL]) + ConfigurationManager.AppSettings[Constantes.ARCHIVO_MOVIL_NOMBRE_BD],
                                                      true);

                    log.Debug("Base de datos copiada:" + rutaBDMovil);
                    OnAvanceSincronizar("Base de datos copiada a PC...", 40);

                    // Instanciar Base de datos SQLITE
                    using (SqLiteDataHelper bdRepositorio = new SqLiteDataHelper(rutaBDMovil))
                    {
                        descargaTransferir = bdRepositorio.exportarData();
                        log.Debug("Información extraida");
                        OnAvanceSincronizar("Información extraida y listo para procesar...", 50);

                        // Procesar data obtenida
                        int registrosProcesados = procesarDescarga(descargaTransferir);
                        log.Debug("Información procesada correctamente Total Reg: " + registrosProcesados.ToString());
                        OnAvanceSincronizar("Información procesada correctamente...", 80);
                    }

                    // Eliminar BD movil
                    this.comunicacion.eliminarArchivoMovil(Libreria.AddSlash(ConfigurationManager.AppSettings[Constantes.DIRECTORIO_MOVIL_BD_MOVIL]) +
                                                           ConfigurationManager.AppSettings[Constantes.ARCHIVO_MOVIL_NOMBRE_BD]);
                    OnAvanceSincronizar("Información eliminada de equipo movil...", 100);
                    #endregion
                }
                return true;
            }
            catch (Exception ex)
            {
                log.Error("Error al sincronizar: " + ex.Message, ex);
                Libreria.MensajeError(ex);
                return false;
            }
            finally
            {
                log.Debug("---- Fin de Sincronizacion ---- ");
            }
        }

        public bool sincronizarFechaHora()
        {
            bool resultado = false;

            try
            {
                #region --- Validar de conexion ---
                // Comprueba si hay conexion con un equipo a la pc
                if (!this.comunicacion.conectarMovil())
                {
                    Libreria.ShowMessageboxExclamacion("Equipo Movil desconectado a la PC!", "PDA no Encontrado");
                    return false;
                }
                #endregion

                #region --- Sincronizar FechaHora ---
                if (!this.comunicacion.existeArchivoMovil(ConfigurationManager.AppSettings[Constantes.DIRECTORIO_MOVIL_ARCHIVO_APLICACION]))
                {
                    Libreria.ShowMessageboxExclamacion("Primero instale la aplicación para poder sincronizar", "Aplicación no Encontrada");
                    return false;
                }

                // Sincronizando Fecha y hora
                this.comunicacion.ejecutarProcesoMovil(ConfigurationManager.AppSettings[Constantes.DIRECTORIO_MOVIL_ARCHIVO_APLICACION],
                                                       string.Format(COMANDO_SINCRONIZACION_FECHAHORA, DateTime.Now.ToString(FORMATO_FECHAHORA))
                                                       );
                #endregion

                resultado = true;
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex);
            }

            return resultado;
        }
        #endregion

        #region --- Metodos Propios ---
        private string generarNombre(string nombreArchivo, string extension)
        {
            return generarNombre(nombreArchivo, extension, false);
        }

        private string generarNombre(string nombreArchivo, string extension, bool conMilisegundo)
        {
            string nombreGenerado = string.Empty;

            if (nombreArchivo.IndexOf(PUNTO) > 0)
            {
                nombreArchivo = nombreArchivo.Split(PUNTO.ToCharArray())[0];
            }

            if (conMilisegundo)
            {
                nombreGenerado = string.Format(FORMATO_NOMBRE_ARCHIVO_GENERADO, nombreArchivo,
                                               DateTime.Now.ToString(FORMATO_FECHA_ARCHIVO),
                                               DateTime.Now.ToString(FORMATO_HORA_ARCHIVO),
                                               DateTime.Now.Millisecond,
                                               extension);
            }
            else
            {
                nombreGenerado = string.Format(FORMATO_NOMBRE_ARCHIVO_GENERADO, nombreArchivo,
                                               DateTime.Now.ToString(FORMATO_FECHA_ARCHIVO),
                                               DateTime.Now.ToString(FORMATO_HORA_ARCHIVO),
                                               string.Empty,
                                               extension);
            }

            return nombreGenerado;
        }

        private string obtenerNombreArchivo(string nombreArchivo)
        {
            string temporal = string.Empty;
            string finNombreArchivo = string.Empty;
            string formatoFechaHora = string.Empty;

            if (nombreArchivo.IndexOf("[") > -1)
            {
                temporal = nombreArchivo.Split('[')[1];
                if (temporal.IndexOf("]") > -1)
                {
                    finNombreArchivo = temporal.Split(']')[1];
                    formatoFechaHora = temporal.Split(']')[0];
                }

                return nombreArchivo.Split('[')[0] + DateTime.Now.ToString(formatoFechaHora) + finNombreArchivo;
            }

            return nombreArchivo;
        }

        private void crearCarpetaPC(string ruta)
        {
            if (!Directory.Exists(ruta))
            {
                crearCarpetaPC(ruta.Substring(0, ruta.LastIndexOf(@"\")));
                Directory.CreateDirectory(ruta);
            }
        }
        #endregion

        #region --- Procesar(Carga/Descarga) Datos ---
        public CargaTransferir procesarCargar()
        {
            CargaTransferir cargaTransferir = null;

            cargaTransferir = new CargaTransferir();

            cargaTransferir.listaParametro = obtenerListaParametro();
            cargaTransferir.listaTienda = null;
            cargaTransferir.listaUsuario = obtenerListaUsuario();
            cargaTransferir.listaMoneda = obtenerListaMoneda();
            cargaTransferir.listaTipoDocumentoVenta = obtenerListaTipoDocumentoVenta();
            cargaTransferir.listaFormaVenta = obtenerListaFormaVenta();
            cargaTransferir.listaCliente = obtenerListaCliente();
            cargaTransferir.listaProducto = obtenerListaProducto();
            cargaTransferir.listaItem = obtenerListaItem();
            cargaTransferir.listaItemComponente = obtenerListaItemComponente();

            return cargaTransferir;
        }

        public int procesarDescarga(DescargaTransferir descargaTransferir)
        {
            // Guardar Ventas
            foreach (Venta venta in descargaTransferir.listaVenta.lista)
            {
                bool resultadoVenta = grabarVenta(venta);
            }

            // Guardar Prestamos
            foreach (Prestamo prestamo in descargaTransferir.listaPrestamos.lista)
            {
                bool resultadoPrestamo = grabarPrestamo(prestamo);
            }

            return 0;
        }

        private string ejecutarOperacionGenerico(Operacion operacion)
        {
            string contenidoXML = string.Empty;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return null;
            }

            return contenidoXML;
        }

        private ListaParametro obtenerListaParametro()
        {
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            Operacion operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_PARAMETROS;

            contenidoXML = ejecutarOperacionGenerico(operacion);
            if (contenidoXML == null) { return null; }

            return contenidoXML.DeserializarTo<ListaParametro>();
        }

        private ListaUsuario obtenerListaUsuario()
        {
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            Operacion operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_USUARIOS;

            operacion.usuario = new Usuario();
            operacion.usuario.nombres = string.Empty;
            operacion.usuario.apellidos = string.Empty;
            operacion.usuario.estado = Constantes.ESTADO_CODIGO_ACTIVO;
            operacion.usuario.nombres = string.Empty;
            operacion.usuario.apellidos = string.Empty;

            contenidoXML = ejecutarOperacionGenerico(operacion);
            if (contenidoXML == null) { return null; }

            return contenidoXML.DeserializarTo<ListaUsuario>();
        }

        private ListaMoneda obtenerListaMoneda()
        {
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            Operacion operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_MONEDAS;

            contenidoXML = ejecutarOperacionGenerico(operacion);
            if (contenidoXML == null) { return null; }

            return contenidoXML.DeserializarTo<ListaMoneda>();
        }

        private ListaTipoDocumentoVenta obtenerListaTipoDocumentoVenta()
        {
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            Operacion operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_TIPO_DOCUMENTO_VENTA;

            contenidoXML = ejecutarOperacionGenerico(operacion);
            if (contenidoXML == null) { return null; }

            return contenidoXML.DeserializarTo<ListaTipoDocumentoVenta>();
        }

        private ListaFormaVenta obtenerListaFormaVenta()
        {
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            Operacion operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_FORMA_VENTA;

            contenidoXML = ejecutarOperacionGenerico(operacion);
            if (contenidoXML == null) { return null; }

            return contenidoXML.DeserializarTo<ListaFormaVenta>();
        }

        private ListaCliente obtenerListaCliente()
        {
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            Operacion operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_CLIENTES;
            operacion.cliente = new Cliente();
            operacion.cliente.nroDocumento = string.Empty;
            operacion.cliente.razonSocial = string.Empty;
            operacion.cliente.estado = Constantes.ESTADO_CODIGO_ACTIVO;

            contenidoXML = ejecutarOperacionGenerico(operacion);
            if (contenidoXML == null) { return null; }

            return contenidoXML.DeserializarTo<ListaCliente>();
        }

        private ListaProducto obtenerListaProducto()
        {
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            Operacion operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_PRODUCTOS;
            operacion.producto = new Producto();

            operacion.producto.nivelProducto = new NivelProducto();
            operacion.producto.nivelProducto.codigo = Constantes.VALOR_CERO;

            operacion.producto.nivelTipo = new NivelTipo();
            operacion.producto.nivelTipo.codigo = Constantes.VALOR_CERO;

            operacion.producto.nivelMaterial = new NivelMaterial();
            operacion.producto.nivelMaterial.codigo = Constantes.VALOR_CERO;

            operacion.producto.nivelColor = new NivelColor();
            operacion.producto.nivelColor.codigo = Constantes.VALOR_CERO;

            operacion.producto.codProductoProveedor = string.Empty;
            operacion.producto.descripcion = string.Empty;
            operacion.producto.unionProducto = string.Empty;
            operacion.producto.estado = Constantes.ESTADO_CODIGO_ACTIVO;

            contenidoXML = ejecutarOperacionGenerico(operacion);
            if (contenidoXML == null) { return null; }

            return contenidoXML.DeserializarTo<ListaProducto>();
        }

        private ListaItem obtenerListaItem()
        {
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            Operacion operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_ITEMS;
            operacion.criterio = "CODTIENDA";
            operacion.valor = ParametrosAplicacion.TIENDA_ACTUAL.codigo;

            contenidoXML = ejecutarOperacionGenerico(operacion);
            if (contenidoXML == null) { return null; }

            return contenidoXML.DeserializarTo<ListaItem>();
        }

        private ListaItemComponente obtenerListaItemComponente()
        {
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            Operacion operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_ITEM_COMPONENTES;

            operacion.item = new Item();
            operacion.item.codItem = Constantes.VALOR_CERO;

            contenidoXML = ejecutarOperacionGenerico(operacion);
            if (contenidoXML == null) { return null; }

            return contenidoXML.DeserializarTo<ListaItemComponente>();
        }

        private bool grabarVenta(Venta venta)
        {
            bool resultado = false;
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_REGISTRAR_VENTA;

                operacion.venta = new Venta();
                operacion.venta.codVenta = Constantes.VALOR_CERO;

                // Estableciendo serie y numero de venta
                operacion.venta.serie = venta.serie;
                operacion.venta.numero = venta.numero;
                operacion.venta.notaCreditoNumero = venta.notaCreditoNumero;
                operacion.venta.notaCreditoSerie = venta.notaCreditoSerie;

                // Estableciendo cliente
                operacion.venta.cliente = new Cliente();
                operacion.venta.cliente.codCliente = venta.cliente.codCliente;

                // Estableciendo el tipo de documento de venta
                operacion.venta.tipoDocumentoVenta = new TipoDocumentoVenta();
                operacion.venta.tipoDocumentoVenta.codigo = venta.tipoDocumentoVenta.codigo;

                // Estableciendo tipo de moneda
                operacion.venta.moneda = new Moneda();
                operacion.venta.moneda.codigo = venta.moneda.codigo;

                // Estableciendo forma de venta
                operacion.venta.formaVenta = new FormaVenta();
                operacion.venta.formaVenta.codigo = venta.formaVenta.codigo;

                //estableciendo tienda
                operacion.venta.tienda = new Tienda();
                operacion.venta.tienda.codigo = venta.tienda.codigo;

                // Obteniendo el monto total
                operacion.venta.subTotal = venta.subTotal;

                // Calculando el igv
                operacion.venta.igv = venta.igv;

                // Calculando el total a pagar
                operacion.venta.total = operacion.venta.subTotal + operacion.venta.igv;

                // Estableciendo listado detalle de venta
                operacion.venta.listaLineaVenta = venta.listaLineaVenta;

                // Estableciendo usuario de registro
                operacion.venta.usuario = new Usuario();
                operacion.venta.usuario.codUsuario = venta.usuario.codUsuario;

                // Estableciendo estado y fecha
                operacion.venta.estado = venta.estado;
                operacion.venta.fechaRegistro = venta.fechaRegistro;

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return false;
                }

                OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                if ((operacionResultado != null) &&
                    (operacionResultado.esOK.Equals(Constantes.SI)))
                {
                    resultado = true;
                }
            }
            catch (Exception ex)
            {
                log.Error(ex.Message + " - CODVENTA=" + venta.codVenta, ex);
            }

            return resultado;
        }

        private bool grabarPrestamo(Prestamo prestamo)
        {
            bool resultado = false;
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_REGISTRAR_PRESTAMO;

                operacion.prestamo = new Prestamo();
                operacion.prestamo.codPrestamo = Constantes.VALOR_CERO;

                // Estableciendo cliente
                operacion.prestamo.cliente = new Cliente();
                operacion.prestamo.cliente.codCliente = prestamo.cliente.codCliente;

                operacion.prestamo.tienda = new Tienda();
                operacion.prestamo.tienda.codigo = prestamo.tienda.codigo;

                operacion.prestamo.periodoxDias = prestamo.periodoxDias;
                operacion.prestamo.fechaInicio = prestamo.fechaInicio;
                operacion.prestamo.fechaFin = prestamo.fechaFin;

                // Estableciendo usuario de registro
                operacion.prestamo.usuario = new Usuario();
                operacion.prestamo.usuario.codUsuario = ParametrosAplicacion.USUARIO_ACTUAL.codUsuario;

                // Estableciendo estado y fecha
                operacion.prestamo.estado = Constantes.ESTADO_DOCUMENTO_PENDIENTE;
                operacion.prestamo.fechaRegistro = DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA);

                operacion.prestamo.listaItem = prestamo.listaItem;

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return false;
                }

                OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                if ((operacionResultado != null) &&
                    (operacionResultado.esOK.Equals(Constantes.SI)))
                {
                    resultado = true;
                }
            }
            catch (Exception ex)
            {
                log.Error(ex.Message + " - CODPRESTAMO=" + prestamo.codPrestamo, ex);
            }

            return resultado;
        }
        #endregion
    }
}
